<?php

/**
 *
 * Modèle pour les produits
 * @author Théo Chamley
 *
 */

class Application_Model_Produit
{

	protected $id_produit;
	protected $nom;
	protected $id_groupe;
	protected $quantite;
	protected $id_type;
	protected $code_barres;

	//--setters et getters--
	public function setIdProduit($id)
	{
		$this->id_produit = $id;
	}

	public function getIdProduit()
	{
		return $this->id_produit;
	}

	public function setName($name)
	{
		$this->nom = $name;
	}

	public function getName()
	{
		return $this->nom;
	}

	public function setIdGroupe($id)
	{
		$this->id_groupe = $id;
	}

	public function getIdGroupe()
	{
		return $this->id_groupe;
	}

	public function setQuantite($q)
	{
		$this->quantite = $q;
	}

	public function getQuantite()
	{
		return $this->quantite;
	}

	public function setIdType($id)
	{
		$this->id_type = $id;
	}

	public function getIdType()
	{
		return $this->id_type;
	}

	public function setCodeBarres($cb)
	{
		$this->code_barres = $cb;
	}

	public function getCodeBarres()
	{
		return $this->code_barres;
	}

	/**
	 *
	 * fonction qui complète l'objet à partir des connaissances de la BDD et de l'id du produit
	 * @param id du produit $id
	 * @throws Zend_Exception
	 */
	public function getById($id)
	{
		$db = new Application_Model_ProduitsTable();
		$rows = $db->fetchAll($db->select()->where('id_produit = ?',$id));

		if(count($rows)>0)
		{
			$this->setIdProduit($id);
			$this->setName($rows[0]['nom']);
			$this->setIdGroupe($rows[0]['id_groupe']);
			$this->setQuantite($rows[0]['quantite']);
			$this->setIdType($rows[0]['id_type']);
			$this->setCodeBarres($rows[0]['code_barres']);
		}
		else
		{
			throw new Zend_Exception('Impossible de trouver le produit n°'.$id);
		}
		return $this;
	}

	/**
	 *
	 * fonction qui complète l'objet à partir des connaissances de la BDD et du code barres du produit
	 * @param code-barres du produit $cb
	 * @throws Zend_Exception
	 */
	public function getByCodeBarres($cb)
	{
		$db = new Application_Model_ProduitsTable();
		$rows = $db->fetchAll($db->select()->where('code_barres = ?',$cb));
		$db_prix = new Application_Model_PrixTable();
		if(count($rows)>0)
		{
			$this->setIdProduit($rows[0]['id_produit']);
			$this->setName($rows[0]['nom']);
			$this->setIdGroupe($rows[0]['id_groupe']);
			$this->setQuantite($rows[0]['quantite']);
			$this->setIdType($rows[0]['id_type']);
			$this->setCodeBarres($cb);
		}
		else
		{
			throw new Zend_Exception('Impossible de trouver le produit correspondant au code barres'.$cb);
		}
		return $this;
	}

	/**
	 *
	 * Met à jour le produit dans la BDD
	 */
	public function update()
	{
		$db = new Application_Model_ProduitsTable();
		$where = array('id_produit = ?' => $this->getIdProduit());
		$p = $db->fetchAll($db->select()->where('id_produit = ?',$this->getIdProduit()));
		$data = array('nom' => $this->getName(),
		  'quantite' => $this->getQuantite(),
		  'id_type' => $this->getIdType(),
		  'code_barres' => $this->getCodeBarres()
		);
		if($p[0]['nom'] != $data['nom'] || $p[0]['quantite'] != $data['quantite'] || $p[0]['id_type'] != $data['id_type'] || $p[0]['code_barres'] != $data['code_barres'])//s'il y a un Ã©lÃ©ment du produit qui a changÃ© alors on fait l'update
		{
			$db->update($data,$where);

			//inscription dans l'historique
			$libelle = "Modification du produit n°".$this->getIdProduit()." du groupe n°".$this->getIdGroupe()." Nom : ".$p[0]['nom']."->".$this->getName()." - Quantite : ".$p[0]['quantite']."->".$this->getQuantite()." - id_type : ".$p[0]['id_type']."->".$this->getIdType()." - CodeBarres : ".$p[0]['code_barres']."->".$this->getCodeBarres();
			$histo = new Application_Model_HistoSystemElement($libelle);
			$histo->AddToHistoSystem();
		}
		return $this;
	}

	/**
	 *
	 * Sauvegarde le produit dans la BDD
	 */
	public function save()
	{
		$db = new Application_Model_ProduitsTable();
		$data = array('nom' => $this->getName(),
		  'id_groupe' => $this->getIdGroupe(),
		  'quantite' => $this->getQuantite(),
		  'id_type' => $this->getIdType(),
		  'code_barres' => $this->getCodeBarres()
		);
		$db->insert($data);
			
		//on récupère l'id du nouveau produit pour l'historique
		$this->setIdProduit($db->getAdapter()->lastSequenceId('id_produit_seq'));
			
		//inscription dans l'historique
		$libelle = "Ajout du produit n°".$this->getIdProduit()." (".$this->getName().") dans le groupe n°".$this->getIdGroupe();
		$histo = new Application_Model_HistoSystemElement($libelle);
		$histo->AddToHistoSystem();
		//fin historique
			
		return $this;
	}

	/**
	 *
	 * Supprime le produit de la BDD
	 */
	public function delete()
	{
		//Suppression des prix du produit
		$db_prix = new Application_Model_PrixTable();
		$n_prix = $db_prix->delete(array('id_produit = ?' => $this->getIdProduit()));
			
		//inscription dans l'historique de la suppression des prix
		$libelle = "Suppresion des prix du produit n°".$this->getIdProduit()." (".$this->getName().") dans le groupe n°".$this->getIdGroupe();
		$histo = new Application_Model_HistoSystemElement($libelle);
		$histo->AddToHistoSystem();
		//fin historique
			
		//Suppression du produit
		$db = new Application_Model_ProduitsTable();
		$n = $db->delete(array('id_produit = ?' => $this->getIdProduit()));
			
		//inscription dans l'historique de la suppression des produits
		$libelle = "Suppresion du produit n°".$this->getIdProduit()." (".$this->getName().") dans le groupe n°".$this->getIdGroupe();
		$histo = new Application_Model_HistoSystemElement($libelle);
		$histo->AddToHistoSystem();
		//fin historique
	}

	/**
	 *
	 * Vente du produit en quantité $nbr au client $client avec vente normale, spéciale ou espèce
	 * @param Quantité de produit vendu $nbr
	 * @param Login du client $client
	 * @param 0=vente espèce, 1=normale, 2=spéciale $type_vente
	 * @throws Zend_Exception
	 */
	public function vente($nbr,$client,$type_vente)
	{
		$session = new Zend_Session_Namespace("codebar");

		/********************************************
		 historique vente & MAJ du solde du client
		 ********************************************/

		//Vente espèce
		if($type_vente == 0)
		{
			$prix = new Application_Model_Prix();
			$prix->getByIds($this->id_produit,2);
			$montant = $prix->getPrix()*$nbr;
			$histo = new Application_Model_HistoVenteElement('vente_espèce',$session->user,$session->user->getGroupeActif(),$montant,$this->id_produit,-$nbr,"Vente espèce...");
		}

		//Vente normale (avec une CodeBar)
		else if($type_vente == 1)
		{
			$prix = new Application_Model_Prix();
			$prix->getByIds($this->id_produit,1);
			$montant = $prix->getPrix()*$nbr;

			/********************************************
			 hack tout moche pour le bug du multi-débit
			 ********************************************/
			$last_histo = Application_Model_HistoVenteElement::getLastItem();
			if ($last_histo->getClient()->getLogin() == $client && $last_histo->getMontant() == $montant && $last_histo->getProduit() == $this->getIdProduit())
			{
				$histo = new Application_Model_HistoSystemElement('Multi-débit '.$this->getName().' pour '.$client.' ('.$montant.'€).Aucun débit n\'a eu lieu.');
				$histo->AddToHistoSystem();
				throw new Zend_Exception('Multi-débit '.$this->getName().' pour '.$client.' ('.$montant.'€).<br/>Aucun débit n\'a eu lieu.');
			}

			//MAJ du solde du client
			$user = Application_Model_User::getByLogin($client);
			if($user->getSolde()-$montant < 0)
			{
				$histo = new Application_Model_HistoSystemElement('La vente de '.$this->getName().' résulterait en un solde négatif pour '.$client.
				' (montant :'.$montant.'€, solde :'.$user->getSolde().'€). Aucun débit n\'a eu lieu.');
				$histo->AddToHistoSystem();
				throw new Zend_Exception('La vente de '.$this->getName().' résulterait en un solde négatif pour '.$client.
				' (montant :'.$montant.'€, solde :'.$user->getSolde().'€).<br/>Aucun débit n\'a eu lieu.');
			} else {
				$user->setSolde($user->getSolde()-$montant)
				->update();
				$histo = new Application_Model_HistoVenteElement($client,$session->user,$session->user->getGroupeActif(),$montant,$this->id_produit,-$nbr,"Vente normale...");
			}
		}

		//Vente avec un prix spécial
		else if($type_vente == 2)
		{
			$prix = new Application_Model_Prix();
			$prix->getByIds($this->id_produit,3);
			$montant = $prix->getPrix()*$nbr;

			/********************************************
			 hack tout moche pour le bug du multi-débit
			 ********************************************/
			$last_histo = Application_Model_HistoVenteElement::getLastItem();
			if ($last_histo->getClient()->getLogin() == $client && $last_histo->getMontant() == $montant && $last_histo->getProduit() == $this->getIdProduit())
			{
				throw new Zend_Exception('Multi-débit '.$this->getName().' pour '.$client.' ('.$montant.'€).<br/>Aucun débit n\'a eu lieu.');
			}

			//MAJ du solde du client
			$user = Application_Model_User::getByLogin($client);
			if($user->getSolde()-$montant < 0)
			{
				$histo = new Application_Model_HistoSystemElement('La vente de '.$this->getName().' résulterait en un solde négatif pour '.$client.
				' (montant :'.$montant.'€, solde :'.$user->getSolde().'€). Aucun débit n\'a eu lieu.');
				$histo->AddToHistoSystem();
				throw new Zend_Exception('La vente de '.$this->getName().' résulterait en un solde négatif pour '.$client.
				' (montant :'.$montant.'€, solde :'.$user->getSolde().'€).<br/>Aucun débit n\'a eu lieu.');
			} else {
				$user->setSolde($user->getSolde()-$montant)
				->update();
				$histo = new Application_Model_HistoVenteElement($client,$session->user,$session->user->getGroupeActif(),$montant,$this->id_produit,-$nbr,"Vente prix spécial");
			}
		}
		$histo->save();
		$this->decreaseStock($nbr);
	}

	/**
	 *
	 * Diminue le stock du produit
	 * @param Diminution du stock $nbr
	 */
	public function decreaseStock($nbr)
	{
		//MAJ de la table produit pour le stock
		$this->setQuantite($this->getQuantite() - $nbr);
		$where = array('id_produit = ?' => $this->getIdProduit());
		$data = array('quantite' => $this->getQuantite());
		$db = new Application_Model_ProduitsTable();
		$db->update($data,$where);
	}

}